211. k8s service endpoint無法連結

前言

某天在建立新的叢集,
服務都已經架好準備給RD了,
最後才發現,平常用的連線方式連不到GCP的Memorystore.Redis。
這個問題卡了整整一週,
不斷的刪除重建、比對、找差異。

故事展開

GKE 版本: 1.28.7-gke.1026000

先簡單說一下架構,
istio增加6379 的port ,
新增redis的svc以及endpoint,
由於redis是GCP的服務,故本身沒有pod,
讓istio能夠透過virtusalService連到這個service,
然後RD透過這個ip以及port連到 GCP的Redis。

先來看錯誤的使用方式,
211-fig.1.jpg
在port name上面設定redis的名稱,
導致svc的endpoints上面無法綁定。

不設定port name的話
211-fig.2.jpg
則可以正常綁定。

目前猜測,可能跟 IANA的port name有關係。
但為什麼會這樣,
就不清楚了。

# Service Name and Transport Protocol Port Number Registry

目前測試出來,只要有設定Name就會綁不到endpoints。

另外,EndpointSlice目前(2024/05/20)仍會無法綁定,

請先改用Endpoint的api。

211-fig.3.jpg

apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: redis # must be the same as service name
  namespace: istio-system
  labels:
    # You should set the "kubernetes.io/service-name" label.
    # Set its value to match the name of the Service
    kubernetes.io/service-name: redis
addressType: IPv4
ports:
  - name: redis # should match with the name of the service port defined above
    appProtocol: redis
    protocol: TCP
    port: 6379
endpoints:
  - addresses:
      - "10.1.11.43"

---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: istio-system
spec:
  ports:
    - protocol: TCP
      port: 6379
      targetPort: 6379
      name: redis    

參照官方文件的作法也不會綁定。
Services without selectors

2024/05/8

有另一個工程師告知,
endpoint那邊的Port Name也加上去的話,
就好了。

結論

頂多改改 Endpoints的address就好了,
port name那些,別亂加。
要加就要一起加,且名稱也要一樣。

---
apiVersion: v1
kind: Endpoints
metadata:
  name: redis # must be the same as service name
  namespace: istio-system
subsets:
  - addresses:
      - ip: 10.122.11.43
    ports:
      - port: 6379
	    name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: istio-system
spec:
  ports:
    - protocol: TCP
      port: 6379
      targetPort: 6379
      name: redis